package com.cctc.config.initializer;

import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

/**
 * @Name CctcWebApplicationInitializer
 * @Description: 注册并初始化 DispatcherServlet 容器
 * [WebApplicationInitializer] 接口
 *
 * Spring MVC 提供的一个接口，它可以确保你的实现被检测到并自动用于初始化任何 Servlet 3 容器。
 * @Author: lichao
 * @Email: li2chao@126.com
 * @Date: 2024-01-23 11:03:09
 **/
public class CctcWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // 1. 创建 Root WebApplicationContext 容器
        // 方式一: 使用注解驱动方式创建 Root WebApplicationContext 容器
        // AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // context.register(SpringWebApplication.class);
        // 方式二: 使用 Xml 配置方式创建 Root WebApplicationContext 容器
        XmlWebApplicationContext rootContext = new XmlWebApplicationContext();
        rootContext.setConfigLocation("/WEB-INF/root-conrtext.xml");
        // 2. 创建、注册并配置 Servlet WebApplicationContext 容器
        DispatcherServlet servlet = new DispatcherServlet(rootContext);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        /**
         * 2.1 配置 Http 表单请求类
         * [MultipartHttpServletRequest] 当收到一个内容类型为 multipart/form-data 的 POST 时，将内容包裹在当前的 HttpServletRequest 中，作为一个 MultipartHttpServletRequest 来提供对解析文件的访问。
         * public MultipartConfigElement(String location, long maxFileSize, long maxRequestSize, int fileSizeThreshold)
         */
        registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
        /**
         * 2.2 启动敏感数据的日志记录
         * [敏感数据] 请求参数和 header 信息在默认情况下是被屏蔽的。
         * 它们的完整记录必须通过 DispatcherServlet 上的 enableLoggingRequestDetails 属性明确启用。
         */
        registration.setInitParameter("enableLoggingRequestDetails", "true");
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}

